#include <iostream>
#include <cstdint>
#include <iomanip>
#include <string>

#include "H264Utils.h"

using namespace std;

// 从无符号字节数组中读取位（高位在前，符合H.264位序）
bool readBit(const unsigned char *buf, size_t len, size_t &pos) {
    if (pos >= len * 8) return false; // 越界返回0
    size_t byteIdx = pos / 8; // 所在字节索引
    size_t bitIdx = 7 - (pos % 8); // 字节内位索引（高位为第7位）
    pos++; // 推进位位置
    return (buf[byteIdx] >> bitIdx) & 0x01;
}

// 指数哥伦布解码（无符号，ue(v)）
int ue(const unsigned char *buf, size_t len, size_t &pos) {
    int leadingZeros = 0;
    // 统计前导0的个数（直到遇到第一个1）
    while (pos < len * 8 && !readBit(buf, len, pos)) {
        leadingZeros++;
    }
    // 读取后续 (leadingZeros + 1) 位并计算值
    int result = 0;
    for (int i = 0; i < leadingZeros; ++i) {
        result = (result << 1) | (readBit(buf, len, pos) ? 1 : 0);
    }
    return ((1 << leadingZeros) - 1) + result; // 公式：(2^n - 1) + 后续值
}

// 获取profile_idc对应的档次名称
string getProfileName(int profile_idc) {
    switch (profile_idc) {
        case 66: return "Baseline Profile";
        case 77: return "Main Profile";
        case 100: return "High Profile";
        case 103: return "High Profile (扩展)"; // 示例数据中实际值
        default: return "Unknown Profile";
    }
}

int main() {
    // 待解析的SPS十六进制数据（已去除起始码）
    unsigned char spsData[] = {
        0x67, 0x64, 0x00, 0x1F, 0xAC, 0x2C, 0x6A, 0x81,
        0x40, 0x16, 0xE9, 0xB8, 0x08, 0x08, 0x0A, 0x00,
        0x00, 0x17, 0x70, 0x00, 0x02, 0xBF, 0x20, 0x08
    };
    constexpr size_t spsLen = sizeof(spsData) / sizeof(spsData[0]);

    int width;
    int height;
    int fps;
    H264Utils::h264DecodeSps(spsData, spsLen, width, height, fps); // Decoding SPS

    std::cout << "Resolution: " << width << "x" << height << std::endl;
    std::cout << "Frame rate: " << fps << std::endl;

    return 0;
}
